package control;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Model;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

import service.PapelService;
import service.RecursoService;
import entity.Papel;
import entity.Recurso;
import exception.AlmiranteException;

@Model
@SessionScoped
public class ManterRecursoControl implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5317108768461608646L;

	@Inject
	private Recurso recurso;
	
	private List<Papel> listPapel;
	
	private List<Recurso> listRecurso;
	
	@EJB
	private RecursoService recursoService;
	
	@EJB
	private PapelService papelService;
	
	private String operacao;
	
	public String iniciarListarRecurso(){
		
		
		return "/pages/recurso/listar_recurso";
	}
	
	public String iniciarCadastrarRecurso(){
		recurso = new Recurso();
		operacao = "Incluir";
		
		try {
			recurso.setPapel(new Papel());
			listPapel = papelService.listaPapel();
			
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao carregar cadastro de recurso", ""));
			return pesquisarRecurso();
		}
		return "/pages/recurso/editar_recurso";
	}
	
	public String iniciarAltarerarRecurso(){
		operacao = "Alterar";
		
		//Popular lista de papel
		listPapel = papelService.listaPapel();
		
		return "/pages/recurso/editar_recurso";
	}
	
	public String iniciarExcluirRecurso(){
		operacao = "Excluir";
		
		try {
			listPapel = papelService.listaPapel();
			
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao carregar cadastro de recurso", ""));
			return pesquisarRecurso();
		}
		//Popular lista de papel
		
		return "/pages/recurso/editar_recurso";
	}
	
	public String incluirRecurso(){
		try {
			recursoService.incluirRecuso(recurso);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso ao cadastrar recurso", ""));
			
			recurso = new Recurso();
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao cadastrar recurso", ""));
			return "/pages/recurso/editar_recurso";
		}
		
		return pesquisarRecurso();
	}
	
	public String excluirRecurso(){
		
		try {
			recursoService.excluirRecuso(recurso);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso ao excluir recurso", ""));
			//TODO lançar mensagem de sucesso
		} 
		
		catch(AlmiranteException e){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			e.printStackTrace();
		}
		catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao excluir recuso", ""));
		}
		
		return pesquisarRecurso();
	}
	
	public String alterarRecurso(){
		try{
			recursoService.alterarRecurso(recurso);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso ao alterar recurso", ""));
			recurso = new Recurso();
		}
		catch (Exception e){
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao alterar recurso", ""));
		}
		
		return pesquisarRecurso();
	}
	
	
	public String pesquisarRecurso(){
		try {
			listRecurso = recursoService.pesquisarRecurso(recurso);
			
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao carregar lista de recurso", ""));
			return "/pages/inicial";
		}
		
		return "/pages/recurso/listar_recurso"; 
	}

	public Recurso getRecurso() {
		return recurso;
	}

	public void setRecurso(Recurso recurso) {
		this.recurso = recurso;
	}

	public List<Papel> getListPapel() {
		return listPapel;
	}

	public void setListPapel(List<Papel> listPapel) {
		this.listPapel = listPapel;
	}

	public RecursoService getRecursoService() {
		return recursoService;
	}

	public void setRecursoService(RecursoService recursoService) {
		this.recursoService = recursoService;
	}

	public String getOperacao() {
		return operacao;
	}

	public void setOperacao(String operacao) {
		this.operacao = operacao;
	}


	public PapelService getPapelService() {
		return papelService;
	}

	public void setPapelService(PapelService papelService) {
		this.papelService = papelService;
	}

	public List<Recurso> getListRecurso() {
		return listRecurso;
	}

	public void setListRecurso(List<Recurso> listRecurso) {
		this.listRecurso = listRecurso;
	}
	
}
